package Crawler;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;


public class Parseo_manual 
{
	static String get_siguiente_categoria_correcta(String idioma, String categoria_inicial, int linea_correcta) throws Exception
	{
		
		System.out.println("linea_correcta: "+linea_correcta);
		String url_busqueda="http://"+idioma+".wikipedia.org/w/api.php?action=query&list=allcategories&format=xml&aclimit=500";
		
		if(!categoria_inicial.equals(""))
			url_busqueda+="&acfrom="+categoria_inicial;
		
		String contenido=get_contenido_pagina(url_busqueda);				
		
		String [] trozos=contenido.split("<c>");
		System.out.println("Apariciones <c>: "+trozos.length);
		String categoria_siguiente=trozos[linea_correcta];
        int posicion_fin_categoria=categoria_siguiente.indexOf("</c>");
        categoria_siguiente=categoria_siguiente.substring(0,posicion_fin_categoria);

        System.out.println(categoria_siguiente);

		return categoria_siguiente;
	}
	
	public static int get_linea_error_categoria(String idioma, String categoria_inicial, int num_paginas)
	{
		
		int resultado;
		String url_busqueda="http://"+idioma+".wikipedia.org/w/api.php?action=query&list=allcategories&format=xml&aclimit="+num_paginas;
		
		if(!categoria_inicial.equals(""))
			url_busqueda+="&acfrom="+categoria_inicial;
		
		try
		{
			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
			factory.setNamespaceAware(true);
			DocumentBuilder builder= factory.newDocumentBuilder();
			builder.parse(url_busqueda);
			resultado=num_paginas;
		}
		catch(Exception e)
		{
			resultado=get_linea_error_categoria(idioma, categoria_inicial, num_paginas-1);
		}
		
		return resultado;
	}
	

	static String get_siguiente_pagina_correcta(String idioma, String pagina_inicial, int linea_correcta) throws Exception
	{
		
		System.out.println("linea_correcta: "+linea_correcta);
		//String url_busqueda="http://"+idioma+".wikipedia.org/w/api.php?action=query&list=allcategories&format=xml&aclimit=500";
		String url_busqueda="http://"+idioma+".wikipedia.org/w/api.php?action=query&list=allpages&format=xml&aplimit=500";
		
		if(!pagina_inicial.equals(""))
			url_busqueda+="&apfrom="+pagina_inicial;
		
		String contenido=get_contenido_pagina(url_busqueda);				
		
		String [] trozos=contenido.split("<p");
		System.out.println("Apariciones <p: "+trozos.length);
		String pagina_siguiente=trozos[linea_correcta];

		System.out.println("linea pagina correcta: "+pagina_siguiente);
		
		int posicion_inicio=pagina_siguiente.indexOf("title=");		
        posicion_inicio+="title=".length();
		int posicion_fin_pagina=pagina_siguiente.indexOf("\" />");
        pagina_siguiente=pagina_siguiente.substring(posicion_inicio+1,posicion_fin_pagina);
        
        System.out.println("linea pagina correcta limpia: "+pagina_siguiente);

		return pagina_siguiente;
	}
	
	public static int get_linea_error_pagina(String idioma, String pagina_inicial, int num_paginas)
	{
		
		int resultado;
		//String url_busqueda="http://"+idioma+".wikipedia.org/w/api.php?action=query&list=allcategories&format=xml&aclimit="+num_paginas;
		String url_busqueda="http://"+idioma+".wikipedia.org/w/api.php?action=query&list=allpages&format=xml&aplimit="+num_paginas;
		
		if(!pagina_inicial.equals(""))
			url_busqueda+="&apfrom="+pagina_inicial;
		
		try
		{
			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
			factory.setNamespaceAware(true);
			DocumentBuilder builder= factory.newDocumentBuilder();
			builder.parse(url_busqueda);
			resultado=num_paginas;
		}
		catch(Exception e)
		{
			resultado=get_linea_error_pagina(idioma, pagina_inicial, num_paginas-1);
		}
		
		return resultado;
	}
	
	
	public static String get_contenido_pagina( String urlString ) throws Exception 
	{
		String contenido=null, linea=null;
		
	   try 
	   {
		    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
			factory.setNamespaceAware(true);
			DocumentBuilder db;
			db = factory.newDocumentBuilder();
			
	     URL url = new URL( urlString );
	     
	     try 
	     {
	       URLConnection URLconnection = url.openConnection ( ) ;
	       HttpURLConnection httpConnection = (HttpURLConnection)URLconnection;
	         
	       int responseCode = httpConnection.getResponseCode ( ) ;
	       if ( responseCode ==HttpURLConnection.HTTP_OK) 
	       {
	    	   contenido="";
	           InputStream in = httpConnection.getInputStream ( ) ;
	            DataInputStream x=new DataInputStream(in);
	            	          	           
	            while((linea=x.readLine())!=null)
	            {
	            	contenido+=linea;
	            }
	            
	        } 
	       else 
	        {
	            System.out.println( "HTTP connection response !=HTTP_OK" );
	            Thread.sleep(10*1000);
	            return get_contenido_pagina(urlString);
	        } 
	     } 
	     catch ( IOException e ) 
	     { 
	          e.printStackTrace ( ) ;
	     } 
	  } 
	   catch ( MalformedURLException e ) 
	  {  
	      e.printStackTrace ( ) ;
	  } 
	  
	  return contenido;
	} 

}
